package eu.floranet.arquivo.model.login;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import eu.floranet.arquivo.temp.EclipseLink;
import eu.floranet.arquivo.temp.EclipseLinkException;
import eu.floranet.repositorio.sql.SysUsers;

/**
 * Classe de tratamento de login de utilizador no modelo da base de dados.
 * 
 * @author jmark
 *
 */
public class ArquivoLogin extends EclipseLink implements IArquivoLogin {

	private SysUsers userLogin = null;
	private boolean isUserLoged = false;
		
	/**
	 * Método default de construção da classe.
	 */
	public ArquivoLogin() {

	}
	
	/**
	 * Método de construção da classe mediante os pârametros de login.
	 * O nome de utilizador e a palavra-passe.
	 * 
	 * @param user - String
	 * @param pass - String
	 * @throws EclipseLinkException Excepção na conexão á base de dados.
	 * @throws ArquivoLoginException Excepção nas credenciais.
	 */
	public ArquivoLogin(String user, String pass) throws EclipseLinkException, ArquivoLoginException {
		try {
			setLogin(user, pass);
		} catch (EclipseLinkException e) {
			throw new EclipseLinkException(e.getMessage(), e.getCause());
		} catch (ArquivoLoginException e) {
			throw new ArquivoLoginException(e.getMessage(), e.getCause());
		}
	}
	
	/**
	 * Método de verificação do utilizador e palavra-passe.
	 * Caso falhe nas credenciais este método dispara a excepção <code>ArquivoLoginException</code>.
	 * 
	 * @param user - String
	 * @param pass - String
	 * @throws EclipseLinkException  Excepção na conexão á base de dados.
	 * @throws ArquivoLoginException  Excepção nas credenciais.
	 */
	public void setLogin(String user, String pass) throws EclipseLinkException, ArquivoLoginException {
		if((user != null) && (pass != null)){
			
			initEntityManager();
			em.getTransaction().begin();
			
			String sqlQueryLogin = "SELECT u FROM SysUsers u WHERE u.userNick='"+user
								+"' AND u.userPass='"+pass+"'";
			
			Query queryUser = em.createQuery(sqlQueryLogin);
			
			try {
				SysUsers sysUser = (SysUsers) queryUser.getSingleResult();
								
				setUserLogin(sysUser);
				cleanUpClosedEMF();
			} catch(NoResultException e){
				throw new ArquivoLoginException(e.getMessage(), e.getCause());
			}
			
		}
	}
		
	/* (non-Javadoc)
	 * @see eu.floranet.arquivo.model.login.IArquivoLogin#setUserLogin(eu.floranet.repositorio.sql.SysUsers)
	 */
	public void setUserLogin(SysUsers sysUsers){
		this.userLogin = sysUsers;
		setUserLogged(true);
	}
	
	/* (non-Javadoc)
	 * @see eu.floranet.arquivo.model.login.IArquivoLogin#getSysUsers()
	 */
	public SysUsers getSysUsers(){
		return this.userLogin;
	}
	
	/* (non-Javadoc)
	 * @see eu.floranet.arquivo.model.login.IArquivoLogin#setUserLogged(boolean)
	 */
	public void setUserLogged(boolean logged){
		this.isUserLoged = logged;
	}
	
	/* (non-Javadoc)
	 * @see eu.floranet.arquivo.model.login.IArquivoLogin#isUserLogged()
	 */
	public boolean isUserLogged(){
		return this.isUserLoged;
	}
	
}
